﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

namespace KnowledgeAssistant
{
    public partial class CryptConfigForm : Form
    {
        public CryptConfigForm()
        {            
            InitializeComponent();
            InitForm();
        }

        private void InitForm()
        {
            if (!DatabaseConnect.crypt)
            {
                this.label4.Text = "Шифрование директивы БД: открыто";
                this.textBox4.Text = DatabaseConnect.not_crypted;
                this.label5.Text = "Путь к шифруемому файлу:";
                this.button3.Text = "Зашифровать";
            }
            else
            {
                this.label4.Text = "Шифрование директивы БД: защищено";
                this.label5.Text = "Путь к зашифрованному файлу:";
                this.textBox4.Text = DatabaseConnect.crypted;
                this.button3.Text = "Расшифровать";
            }
            this.textBox6.PasswordChar = '#';
            this.textBox6.ForeColor = System.Drawing.SystemColors.Menu;
            this.textBox6.Text = DatabaseConnect.SecretKey;
        }

        private void checkBox2_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox2.Checked) this.textBox6.PasswordChar = '\0';
            else this.textBox6.PasswordChar = '*';
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (DatabaseConnect.crypt)           
            {
                Boolean fatal_error = false;
                GCHandle gch = GCHandle.Alloc(DatabaseConnect.crypted, GCHandleType.Pinned);
                try { Crypto.DecryptFile(DatabaseConnect.crypted, DatabaseConnect.not_crypted, DatabaseConnect.SecretKey); }                
                catch (Exception)
                {
                    MessageBox.Show("Не удалось расшифровать файл с директивой для SQL-соединения!");
                    fatal_error = true;
                }
                gch.Free();
                FileInfo file = new FileInfo(DatabaseConnect.crypted);
                file.Delete();
                if (!fatal_error)
                    MessageBox.Show("Шифр-файл с именем \n" + DatabaseConnect.not_crypted + "\nуспешно расшифрован!");                
                DatabaseConnect.crypt = false;
            }
            else
            {
                GCHandle gch = GCHandle.Alloc(DatabaseConnect.not_crypted, GCHandleType.Pinned);
                Crypto.EncryptFile(DatabaseConnect.not_crypted, DatabaseConnect.crypted, DatabaseConnect.SecretKey);
                gch.Free();
                FileInfo file = new FileInfo(DatabaseConnect.not_crypted);
                file.Delete();
                MessageBox.Show("Шифр-файл с именем \n" + DatabaseConnect.crypted + "\nуспешно создан!");                
                DatabaseConnect.crypt = true;
            }
            InitForm();
        }

        private void CryptConfigForm_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                button3_Click(sender, e);
            }
        }
    }
}
